#pragma once
#include <QObject>
#include "cnp.hpp"
#include <memory>
#include <deque>
#include <QMutex>
#include <QDebug>

class DeviceNode : public QObject {
    Q_OBJECT
public:
    explicit DeviceNode(const QString& deviceName, QObject* parent = nullptr);
    ~DeviceNode();

    const QString& deviceName() const { return m_deviceName; }

    // 发布命令接口
    Q_INVOKABLE void publishCmd(const QString& deviceName,const QString& cmd);

    // 可选：调整内部队列最大容量（>=1）
    void setMaxQueueSize(int n) { m_maxQueueSize = std::max(1, n); }

signals:
    // 状态消息（subscribeStatus）
    void cmdReceived(const QString& content);
    // 事件消息（subscribeEvent）
    void eventReceived(const QString& content);

private slots:
    // 在 DeviceNode 所在线程中处理缓存队列并 emit 信号
    void processStatusQueue();
    void processEventQueue();

private:
    QString m_deviceName;
    std::unique_ptr<CNPClient> m_client;

    // 有界队列（状态 / 事件）
    int m_maxQueueSize = 100;               // 默认容量

    QMutex m_statusMutex;
    std::deque<QString> m_statusQueue;
    bool m_statusScheduled = false;

    QMutex m_eventMutex;
    std::deque<QString> m_eventQueue;
    bool m_eventScheduled = false;
};
